package models;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import play.Logger;
import play.mvc.Scope.Session;
import securesocial.provider.UserId;

@Entity
public class Paciente extends Usuario {
	
	private static final long serialVersionUID = -5689185847787737497L;

	@OneToOne(cascade=CascadeType.ALL)
	private Perfil perfil;
	
	@OneToMany(mappedBy="paciente")
	private List<Plan> planes = new ArrayList<Plan>();
	
	@ManyToOne
	private Nutri nutricionista;
	
	@Enumerated(EnumType.STRING)
	private EstadoPaciente estadoPaciente;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<Frecuente> frecuentes = new ArrayList<Frecuente>();
	
	//Ojo, no confundir con relación que está en Usuario (esa es many to one). Esta es exlcusiva del paciente
	@ManyToMany
	private List<Plato> platosAsignadosAPaciente = new ArrayList<Plato>();
	
	public Paciente(String email, String password, String nombre, UserId socialUserId) {
		super(email, password, nombre, socialUserId, Arrays.asList((ADietaRol)ADietaRol.find("byName", TipoRol.PACIENTE.name()).first()));
	}
	
	public List<Plan> getPlanes() {
		return planes;
	}
	
	public void setPlanes(List<Plan> planes) {
		this.planes = planes;
	}
	
	public Nutri getNutricionista() {
		return nutricionista;
	}
	
	public void setNutricionista(Nutri nutricionista) {
		this.nutricionista = nutricionista;
	}
	
	public Perfil getPerfil() {
		return perfil;
	}
	
	public void setPerfil(Perfil perfil) {
//		perfil.setPaciente(this);
		this.perfil = perfil;
	}
	
	public List<Frecuente> getFrecuentes() {
		return frecuentes;
	}
	
	public void setFrecuentes(List<Frecuente> frecuentes) {
		this.frecuentes = frecuentes;
	}
	
	@Override
	public Boolean isPaciente() {
		return Boolean.TRUE;
	}

	public EstadoPaciente getEstadoPaciente() {
		return estadoPaciente;
	}

	public void setEstadoPaciente(EstadoPaciente estadoPaciente) {
		this.estadoPaciente = estadoPaciente;
	}

	@Override
	public void addNutriToSession(Session session) {
		
		String nutriNombre = "";
		
		if (this.getNutricionista() != null) {
			nutriNombre = this.getNutricionista().getNombre();
		}
		else {
			nutriNombre = "NADIE";
		}
		
		Logger.warn("Miiiiiiiiii nutricionista es: " + nutriNombre + " - estado: " + this.estadoPaciente);
		
		if (this.getNutricionista() != null && this.estadoPaciente.equals(EstadoPaciente.CONFIRMADO)) {
			session.put("nutri_nombre", this.getNutricionista().getNombre());
			session.put("nutri_mail", this.getNutricionista().getEmail());
		}
		session.put("paciente_nombre", this.getNombre());
		session.put("paciente_mail", this.getEmail());
	}
	
	public Boolean tieneAsignado(TemplatePlan templatePlan) {
		
		for (Plan plan : this.getPlanes()) {
			if(plan.getTemplatePlan() != null && plan.getTemplatePlan().getId().equals(templatePlan.getId())) {
				return Boolean.TRUE;
			}
		}
		
		return Boolean.FALSE;
		
	}

	@Override
	public Paciente getPacienteToCreateObjective(Long pacienteId) {
		return this;
	}

	public Plan buscarPlanActivo() {
		
		for (Plan plan : this.getPlanes()) {
			if(EstadoPlan.ACTIVO.equals(plan.getEstado())) {
				return plan;
			}
		}
		
		return null;
	}
	
	public Boolean tenesEstePlato(String id){
		for(Plato p : this.getPlatosAsignadosAPaciente()){
			if(p.id.toString().equals(id)){
				return true;
			}
		}
		return false;
	}

	public List<Plato> getPlatosAsignadosAPaciente() {
		return platosAsignadosAPaciente;
	}

	public void setPlatosAsignadosAPaciente(List<Plato> platosAsignadosAPaciente) {
		this.platosAsignadosAPaciente = platosAsignadosAPaciente;
	}
}